package com.itheima.rabbitmq.routing;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @author : [chenxys]
 * @version : [v1.0]
 * @Description : 路由方式生产者 --> 交换机类型:direct 如果在生产者声明交换机时,设置持久化为true。则消费者在声明时也需要声明为true
 * @createTime : [2022/6/23 12:28]
 */
public class Producer {
    //交换机名称
    static final String DIRECT_EXCHAGE = "direct_exchange";
    //队列名称
    static final String DIRECT_QUEUE_1 = "direct_queue_1";
    //队列名称
    static final String DIRECT_QUEUE_2 = "direct_queue_2";

    public static void main(String[] args) throws Exception {
        // 1、创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 2、设置参数
        // 2.1、设置IP，默认为127.0.0.1
        factory.setHost("127.0.0.1");
        // 2.2、设置端口，默认为5672
        factory.setPort(5672);
        // 2.3、设置虚拟机,默认为/
        factory.setVirtualHost("/heima");
        // 2.4、设置用户名,默认为guest
        factory.setUsername("heima");
        // 2.5、设置密码,默认为guest
        factory.setPassword("heima");

        // 3、创建连接 Connection
        Connection connection = factory.newConnection();

        // 创建channel
        Channel channel = connection.createChannel();

        // 声明交换机             交换机名称      交换机类型
        /*exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)
         * 参数：
         * 1、exchange：交换机名称
         * 2、type：交换机类型
         *       * DIRECT("direct")：定向
         *       * FANOUT("fanout")：扇形[广播:当前交换机会将信息发送给与之绑定的所有队列]
         *       * TOPIC("topic")：通配符方式
         *       * HEADERS("headers")：参数匹配
         * 3、durable：是否持久化
         * 4、autoDelete：自动删除
         * 5、internal：内部使用[一般为false]
         * 6、arguments：参数
         * */
        channel.exchangeDeclare(DIRECT_EXCHAGE, BuiltinExchangeType.DIRECT,true,false,false,null);
        // 声明（创建）队列
        /**
         * 参数1：队列名称
         * 参数2：是否定义持久化队列
         * 参数3：是否独占本次连接
         * 参数4：是否在不使用的时候自动删除队列
         * 参数5：队列其它参数
         */
        channel.queueDeclare(DIRECT_QUEUE_1,true,false,false,null);
        channel.queueDeclare(DIRECT_QUEUE_2,true,false,false,null);

        //队列绑定交换机     队列名称        交换机名称       路由键[默认为空字符串]
        /* queueBind(String queue, String exchange, String routingKey)
         * 参数：
         *   1、queue：队列名称
         *   2、exchange：交换机名称
         *   3、routingKey：路由键。绑定规则
         *       * 如果交换机的类型为FANOUT，routingKey设置为""
         */
        //队列1 绑定error
        channel.queueBind(DIRECT_QUEUE_1,DIRECT_EXCHAGE,"error");
        //队列2 绑定info、error、warning
        channel.queueBind(DIRECT_QUEUE_2,DIRECT_EXCHAGE,"info");
        channel.queueBind(DIRECT_QUEUE_2,DIRECT_EXCHAGE,"error");
        channel.queueBind(DIRECT_QUEUE_2,DIRECT_EXCHAGE,"warning");

        // 发送信息
        String message1 = "你好,小兔子。开启路由模式-- error";
        String message2 = "你好,小兔子。开启路由模式-- info";
        String message3 = "你好,小兔子。开启路由模式-- warning";
        /**
         * 参数1：交换机名称，如果没有指定则使用默认Default Exchage
         * 参数2：路由key,简单模式可以传递队列名称
         * 参数3：消息其它属性
         * 参数4：消息内容
         */
        channel.basicPublish(DIRECT_EXCHAGE,"error",null,message1.getBytes());
        channel.basicPublish(DIRECT_EXCHAGE,"info",null,message2.getBytes());
        channel.basicPublish(DIRECT_EXCHAGE,"warning",null,message3.getBytes());
        // 关闭资源
        channel.close();
        connection.close();
    }
}
